"""
@author: Leo
@version: 1.0.0
@file: sms_utils.py
@time: 2023/9/12 12:40 AM
"""
import os
import random

from qcloudsms_py import SmsMultiSender, SmsSingleSender
from qcloudsms_py.httpclient import HTTPError

from lab.common.response import BadRequest


class SmsUtils:
    app_id = os.getenv('TENCENT_SMS_APP_ID')  # 自己应用ID
    app_key = os.getenv('TENCENT_SMS_APP_KEY')  # 自己应用Key
    sms_sign = os.getenv('TENCENT_SMS_SIGN')
    template_id = os.getenv('TENCENT_SMS_TEMPLATE_ID')

    @staticmethod
    def send_sms_single(phone_num, template_param_list):
        """
        单条发送短信
        :param phone_num: 手机号
        :param template_id: 腾讯云短信模板ID
        :param template_param_list: 短信模板所需参数列表，例如:【验证码：{1}，描述：{2}】，则传递参数 [888,666]按顺序去格式化模板
        :return:
        """
        # 自己腾讯云创建签名时填写的签名内容（使用公众号的话这个值一般是公众号全称或简称）
        sender = SmsSingleSender(SmsUtils.app_id, SmsUtils.app_key)
        try:
            response = sender.send_with_param(86, phone_num, SmsUtils.template_id, template_param_list, sign=SmsUtils.sms_sign)
        except HTTPError as e:
            response = {'result': 1000, 'errmsg': "网络异常发送失败"}
            raise BadRequest(response)
        return response

    @staticmethod
    def send_sms_multi(phone_num_list, param_list):
        """
        批量发送短信
        :param phone_num_list:手机号列表
        :param template_id:腾讯云短信模板ID
        :param param_list:短信模板所需参数列表，例如:【验证码：{1}，描述：{2}】，则传递参数 [888,666]按顺序去格式化模板
        :return:
        """
        appid = os.getenv('TENCENT_SMS_APP_ID')  # 自己应用ID
        appkey = os.getenv('TENCENT_SMS_APP_KEY')  # 自己应用Key
        sms_sign = os.getenv('TENCENT_SMS_SIGN')  # 自己腾讯云创建签名时填写的签名内容（使用公众号的话这个值一般是公众号全称或简称）
        sender = SmsMultiSender(SmsUtils.app_id, SmsUtils.app_key)
        try:
            response = sender.send_with_param(86, phone_num_list, SmsUtils.template_id, param_list, sign=SmsUtils.sms_sign)
        except HTTPError as e:
            response = {'result': 1000, 'errmsg': "网络异常发送失败"}
            raise BadRequest(response)
        return response

    @staticmethod
    def generate_verification_code(length=6):
        code = ''.join(random.choice('0123456789') for _ in range(length))
        return code

